home *** CD-ROM | disk | FTP | other *** search
- /* ADTwist.c
- * After Dark module that "twists" the screen pixels
- * Copyright ©1996 Michael D. Crawford. All Rights Reserved.
- * You may use this code on the condition that you read the following web page:
- * http://www.scruznet.com/~crawford/WordServices/wdsvindex.html
- */
-
- #include <QDOffscreen.h>
- #include "GraphicsModule_Types.h"
- #include "MessageHandlers.h"
- #include "FindBrowser.h"
-
- #define kCannotFindBrowserID 128
- #define kMaxScreens 8
-
- typedef struct{
- short curLine;
- GWorldPtr tempWorld;
- GWorldPtr oldScreen;
- }tScreenInfo, *tScreenInfoPtr, **tScreenInfoHdl;
-
- typedef struct{
- // short curLine;
- Boolean firstDraw;
- short curMonitor;
- // GWorldPtr tempWorld;
- // GWorldPtr oldScreen;
- tScreenInfoHdl screenInfo[ kMaxScreens ];
- } tTwistInfo, *tTwistPtr, **tTwistHandle;
-
- void CenterRect( Rect *toPtr, Rect *fromPtr, Rect *inPtr );
-
- OSErr DoInitialize(Handle *storage, RgnHandle blankRgn, GMParamBlockPtr params)
- {
- tTwistHandle tHdl;
- Rect r;
- GWorldPtr tempWorld;
- GWorldPtr oldScreen;
- GWorldPtr curWorld;
- GDHandle curDev;
- OSErr err;
- short i;
-
- tHdl = (tTwistHandle)NewHandle( sizeof( tTwistInfo ) );
- if ( !tHdl )
- return MemError();
-
- *storage = (Handle)tHdl;
-
- (*tHdl)->firstDraw = true;
-
- GetGWorld( &curWorld, &curDev );
-
- for ( i = 0; i < params->monitors->monitorCount ; i++){
- (*tHdl)->screenInfo[ i ] = (tScreenInfoHdl)NewHandle( sizeof( tScreenInfo ) );
- if ( !(*tHdl)->screenInfo[ i ] )
- return memFullErr;
-
- r = params->monitors->monitorList[ i ].bounds;
-
- err = NewGWorld( &oldScreen,
- params->monitors->monitorList[ i ].curDepth,
- &r,
- (CTabHandle)NULL,
- (GDHandle)NULL,
- (GWorldFlags)0 );
-
- if ( err )
- return err;
-
- (*(*tHdl)->screenInfo[ i ])->oldScreen = oldScreen;
-
- LockPixels( oldScreen->portPixMap );
-
- SetGWorld( oldScreen, curDev );
-
- CopyBits( ¶ms->qdGlobalsCopy->qdThePort->portBits,
- (BitMap*)*( oldScreen )->portPixMap,
- &r,
- &r,
- srcCopy,
- (RgnHandle)NULL );
-
- UnlockPixels( oldScreen->portPixMap );
-
- r.right = r.left + 1;
-
- (*(*tHdl)->screenInfo[ i ])->curLine = r.top;
-
- err = NewGWorld( &tempWorld,
- params->monitors->monitorList[ i ].curDepth,
- &r,
- (CTabHandle)NULL,
- (GDHandle)NULL,
- (GWorldFlags)0 );
-
- if ( err )
- return err;
-
- (*(*tHdl)->screenInfo[ i ])->tempWorld = tempWorld;
-
- LockPixels( tempWorld->portPixMap );
-
- }
-
- for ( ; i < kMaxScreens; i++ ){
- (*tHdl)->screenInfo[ i ] = (tScreenInfoHdl)NULL;
-
- }
-
- SetGWorld( curWorld, curDev );
-
- return noErr;
- }
-
- OSErr DoClose( Handle storage,RgnHandle blankRgn,GMParamBlockPtr params )
- {
- tTwistHandle tHdl;
- short i;
-
- tHdl = (tTwistHandle)storage;
-
- if ( !tHdl )
- return noErr;
-
- for ( i = 0; i < kMaxScreens; i++ ){
- if ( (*tHdl)->screenInfo[ i ] ){
- if ( (*(*tHdl)->screenInfo[ i ])->tempWorld )
- DisposeGWorld( (*(*tHdl)->screenInfo[ i ])->tempWorld );
- if ( (*(*tHdl)->screenInfo[ i ])->oldScreen )
- DisposeGWorld( (*(*tHdl)->screenInfo[ i ])->oldScreen );
- }
- }
-
- DisposeHandle( (Handle)tHdl );
-
- return noErr;
- }
-
- OSErr DoBlank(Handle storage, RgnHandle blankRgn, GMParamBlockPtr params)
- {
- PicHandle pictH;
- Rect r;
- Rect screenRect;
- Rect toRect;
- GWorldPtr curWorld;
- GWorldPtr picWorld;
- GDHandle curDev;
- OSErr err;
- long newTime;
-
- FillRgn( blankRgn, ¶ms->qdGlobalsCopy->qdBlack );
-
- pictH = GetPicture( 1000 );
- if ( !pictH )
- return noErr;
-
- r = (*pictH)->picFrame;
-
- err = NewGWorld( &picWorld,
- 1,
- &r,
- (CTabHandle)NULL,
- (GDHandle)NULL,
- (GWorldFlags)0 );
-
- if ( err )
- return err;
-
- LockPixels( picWorld->portPixMap );
-
- GetGWorld( &curWorld, &curDev );
- SetGWorld( picWorld, curDev );
-
- DrawPicture( pictH, &r );
-
- InvertRect( &r );
-
- SetGWorld( (GWorldPtr)( params->qdGlobalsCopy->qdThePort ), curDev );
-
- screenRect = params->monitors->monitorList[ 0 ].bounds;
-
- CenterRect( &toRect, &r, &screenRect );
-
- CopyBits( (BitMap*)*( picWorld )->portPixMap,
- ¶ms->qdGlobalsCopy->qdThePort->portBits,
- &r,
- &toRect,
- srcCopy,
- (RgnHandle)NULL );
-
- ReleaseResource( (Handle)pictH );
-
- Delay( 60, &newTime );
-
- return noErr;
- }
-
- void CenterRect( Rect *toPtr, Rect *fromPtr, Rect *inPtr )
- {
- short inWidth;
- short inHeight;
-
- inWidth = inPtr->right - inPtr->left;
- inHeight = inPtr->bottom - inPtr->top;
-
- toPtr->left = inPtr->left + ( inWidth / 2 )
- - ( fromPtr->right - fromPtr->left ) / 2;
- toPtr->top = inPtr->top + ( inHeight / 2 )
- - ( fromPtr->bottom - fromPtr->top ) / 2;
-
- toPtr->right = toPtr->left + ( fromPtr->right - fromPtr->left );
- toPtr->bottom = toPtr->top + ( fromPtr->bottom - fromPtr->top );
-
- return;
- }
-
- OSErr DoDrawFrame(Handle storage,RgnHandle blankRgn,GMParamBlockPtr params)
- {
- tTwistHandle tHdl;
- short curLine;
- GWorldPtr tempWorld;
- Rect fromRect;
- Rect toRect;
- Rect scrollRect;
- GDHandle curDev;
- GWorldPtr curWorld;
- short i;
- short j;
-
- tHdl = (tTwistHandle)storage;
-
- GetGWorld( &curWorld, &curDev );
-
- if ( (*tHdl)->firstDraw ){
- (*tHdl)->firstDraw = false;
-
- for ( i = 0; i < kMaxScreens; i++ ){
- if ( (*tHdl)->screenInfo[ i ] ){
- fromRect = params->monitors->monitorList[ i ].bounds;
-
- SetGWorld( (GWorldPtr)( params->qdGlobalsCopy->qdThePort ), curDev );
-
- LockPixels( ((*(*tHdl)->screenInfo[ i ])->oldScreen)->portPixMap );
-
- CopyBits( (BitMap*)*( (*(*tHdl)->screenInfo[ i ])->oldScreen)->portPixMap,
- ¶ms->qdGlobalsCopy->qdThePort->portBits,
- &fromRect,
- &fromRect,
- srcCopy,
- (RgnHandle)NULL );
-
- DisposeGWorld( (*(*tHdl)->screenInfo[ i ])->oldScreen );
- (*(*tHdl)->screenInfo[ i ])->oldScreen = (GWorldPtr)NULL;
- }
- }
- }
-
- #define kNumLoops 15
-
- for ( i = 0; i < kNumLoops; i++ ){
-
- for ( j = 0; j < params->monitors->monitorCount; j++ ){
- (*(*tHdl)->screenInfo[ j ])->curLine++;
- if ( ( *(*tHdl)->screenInfo[ j ])->curLine
- >= params->monitors->monitorList[ j ].bounds.bottom ){
- (*(*tHdl)->screenInfo[ j ])->curLine
- = params->monitors->monitorList[ j ].bounds.top;
- }
-
- curLine = (*(*tHdl)->screenInfo[ j ])->curLine;
-
- fromRect = params->monitors->monitorList[ j ].bounds;
- toRect = fromRect;
- scrollRect = fromRect;
-
- fromRect.left = fromRect.right - 1;
- fromRect.bottom = curLine;
-
- toRect.right = toRect.left + 1;
- toRect.bottom = curLine;
-
- scrollRect.bottom = curLine;
-
-
- SetGWorld( (*(*tHdl)->screenInfo[ j ])->tempWorld, curDev );
-
- CopyBits( ¶ms->qdGlobalsCopy->qdThePort->portBits,
- (BitMap*)*( (*(*tHdl)->screenInfo[ j ])->tempWorld)->portPixMap,
- &fromRect,
- &toRect,
- srcCopy,
- (RgnHandle)NULL );
-
- SetGWorld( (GWorldPtr)( params->qdGlobalsCopy->qdThePort ), curDev );
-
- ScrollRect( &scrollRect, 1, 0, (RgnHandle)NULL );
-
- CopyBits( (BitMap*)*( (*(*tHdl)->screenInfo[ j ])->tempWorld)->portPixMap,
- ¶ms->qdGlobalsCopy->qdThePort->portBits,
- &toRect,
- &toRect,
- srcCopy,
- (RgnHandle)NULL );
- }
- }
-
- return noErr;
- }
-
- OSErr DoSetUp(RgnHandle blankRgn,short message,GMParamBlockPtr params)
- {
- return noErr;
- }
-
- OSErr DoButton(RgnHandle blankRgn,short message,GMParamBlockPtr params)
- {
- AEAddressDesc creatorDesc;
- AppleEvent gurlEvt;
- AppleEvent replyEvt;
- OSType creator;
- AEDesc urlDesc;
- StringHandle urlStr;
- long len;
- OSErr err;
-
- err = FindBrowser( &creator );
-
- if ( err ){
- return err;
- }
-
- if ( creator == 'null' ){
- StopAlert( kCannotFindBrowserID, (ModalFilterUPP)NULL );
- return noErr;
- }
-
- err = AECreateDesc( typeApplSignature,
- (Ptr)&creator,
- sizeof( creator ),
- &creatorDesc );
- if ( err )
- return err;
-
- urlStr = (StringHandle)GetResource( 'STR ', 129 );
- if ( !urlStr )
- return resNotFound;
-
- len = GetHandleSize( (Handle)urlStr );
-
- err = AECreateDesc( typeChar,
- &( (*urlStr)[ 1 ] ),
- len - 1,
- &urlDesc );
- if ( err )
- return err;
-
-
- if ( creator == 'MOS!' ){
- // NCSA Mosaic has its own ideas for AE urls
- err = AECreateAppleEvent( 'mos!',
- 'ourl',
- &creatorDesc,
- kAutoGenerateReturnID,
- kAnyTransactionID,
- &gurlEvt );
- }else{
- err = AECreateAppleEvent( 'GURL',
- 'GURL',
- &creatorDesc,
- kAutoGenerateReturnID,
- kAnyTransactionID,
- &gurlEvt );
- }
- if ( err )
- return err;
-
- err = AEDisposeDesc( &creatorDesc );
- if ( err )
- return err;
-
- err = AEPutParamDesc( &gurlEvt,
- keyDirectObject,
- &urlDesc );
-
- if ( err )
- return err;
-
- err = AEDisposeDesc( &urlDesc );
- if ( err )
- return err;
-
- err = AESend( &gurlEvt,
- &replyEvt,
- kAEWaitReply + kAECanInteract + kAECanSwitchLayer,
- kAENormalPriority,
- 300,
- (AEIdleUPP)NULL,
- (AEFilterUPP)NULL );
-
- if ( err ){
- return err;
- }
-
- err = AEDisposeDesc( &gurlEvt );
- if ( err )
- return noErr;
-
- err = AEDisposeDesc( &replyEvt );
- if ( err )
- return noErr;
-
- return noErr;
- }
-
-